public class Test {
    //给你两个单链表的头节点headA和headB，请你找出并返回两个单链表相交的起始节点，如果不存在相交节点就返回null；(已经给了两个相交链表了）
    public static MySingleLinkedList.ListNode getIntersectionNode
    (MySingleLinkedList.ListNode headA,MySingleLinkedList.ListNode headB){
        MySingleLinkedList.ListNode pl=headA;//用pl存长的链表，我先用headA，后面再判断调换
        MySingleLinkedList.ListNode ps=headB; // 这儿肯定是不对了吧，你ps求得是lenB
        int lenA=0;
        int lenB=0;
        while (pl!=null){
            lenA++;//在这里我们把headA的长度求出来
            pl=pl.next;//注意一下pl此时为空了

        }
        while (ps!=null){
            lenB++;
            ps=ps.next;
        }

        pl=headA;
        ps=headB;
        int len=lenA-lenB;//这个时侯，根据len的正负判断一下两个链表谁长谁短
        if(len<0){//此时headB长
            pl=headB;//在这里我们已经实现了长链表是headA，短链表是headB
            ps=headA;
            len=lenB-lenA;////len是两个链表的差值，让长链表现在走len步，然后让两个链表一起走，直到相遇就是我们要找的节点
        }
        while (len!=0){
            pl=pl.next;
            len--;//让长的先走len步
        }
        while (pl!=ps){
            pl=pl.next;
            ps=ps.next;//让两个一起走，直到相遇停下来
        }
        if(pl==null){
        return  null;
        }
        return pl;
    }
    //创建一个相交链表，力扣上面已经给了，但是这里需要自己创建
    public static void createCut(MySingleLinkedList.ListNode headA,
                                 MySingleLinkedList.ListNode headB){
        headA.next.next=headB.next.next;

    }
    //合并两个有序链表合并成一个升序链表（傀儡节点）
    public static  MySingleLinkedList.ListNode megeTowLists(MySingleLinkedList.ListNode headA,
                                                    MySingleLinkedList.ListNode headB) {
        MySingleLinkedList.ListNode newH = new MySingleLinkedList.ListNode(-1);
        MySingleLinkedList.ListNode tmp = newH;
        while (headA != null && headB != null) {
            if (headA.val < headB.val) {
                tmp.next = headA;
                headA = headA.next;
                tmp = tmp.next;
            } else {
                tmp.next = headB;
                // 这里不是headA
//              //  headA = headB.next;
                headB = headB.next;
                tmp = tmp.next;
            }
        }
        if (headA == null) {
            tmp.next = headB;
        }
        if (headB == null) {
            tmp.next = headA;
        }
        return newH.next;
    }
    public static void main(String[] args) {
        MySingleLinkedList msl1 = new MySingleLinkedList();
        MySingleLinkedList msl2 = new MySingleLinkedList();


        msl1.addLast(2);
        msl1.addLast(2);
        msl1.addLast(4);
        msl1.addLast(4);
        msl1.addLast(5);
        msl1.midNode();
        msl2.addLast(4);
        msl2.addLast(6);
        msl2.addLast(7);
        msl2.addLast(8);
        msl2.addLast(9);
        msl2.addLast(100);
        msl2.createLoop();
//       msl2.midNode();
//        msl1.display();
//        msl2.display();
//        MySingleLinkedList.ListNode ret=getIntersectionNode(msl1.head,msl2.head);
//
//        if (ret == null) {
//            System.out.println("ret == null"); //这而返回的ret 是null ，你 null.val 肯定是会报空指针异常的
//        }else {
//            System.out.println(ret.val);
//
//        }
        MySingleLinkedList.ListNode ret = msl2.detectCycle(msl2.head);
        if (ret == null) {
           // return null;这个方法没有返回值
            System.out.println("null");
        } else {
            System.out.println(ret.val);

        }
    }
    public static void main1(String[] args) {
        MySingleLinkedList mls=new MySingleLinkedList();
        //mls.createList();
        mls.addFirst(1);
        mls.addFirst(2);
        //mls.addFirst(3);
       // mls.addFirst(2);
       // mls.addLast(6);
       // mls.addIndex(0,99);
        mls.display();
//        System.out.println(mls.size());
//        System.out.println(mls.contains(99));
       /// mls.remove(3);
      //  mls.display();
       //mls.removeAllKey(2);
      //  mls.display();
    //    mls.clear();
       // mls.display();
        //翻转字符串
       //MySingleLinkedList.ListNode ret= mls.reverseList();
       // mls.display(ret);
      //  MySingleLinkedList.ListNode mid=mls.midNode();//返回值ListNode是一个抽象类
       // System.out.println(mid.val);
        int ret=mls.kthToLast(3);
        System.out.println(ret);


    }

}
